package com.duke.javaagent.bytebuddy01;


import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.matcher.ElementMatchers;

import java.lang.instrument.Instrumentation;

/**
 * @author gjy
 * @create 2024-11-22 11:28 AM
 */
public class AgentMain {
    private static final String CONTROLLER_NAME = "org.springframework.stereotype.Controller";
    private static final String REST_CONTROLLER_NAME = "org.springframework.web.bind.annotation.RestController";
    /**
     * 静态加载模式
     * premain 方法在目标 JVM 中实际运行 agent 的线程中执行，因此 premain 方法不能修改目标 JVM 的状态。
     *
     * 参数：agentArgs agent参数
     * instrumentation agent运行时的环境
     * @param agentArgs
     * @param inst
     */
    public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println("bytebuddy  preMain 执行了...");

        AgentBuilder builder = new AgentBuilder.Default()
                .ignore(ElementMatchers.nameStartsWith("net.bytebuddy"))
                .type(ElementMatchers.isAnnotatedWith(ElementMatchers.named(CONTROLLER_NAME).or(ElementMatchers.named(REST_CONTROLLER_NAME))))
                .transform(new AgentTransformer())
                .with(new ByteListener());
        builder.installOn(inst);


        System.out.println("Agent setup complete!");

    }

    /**
     * 动态加载模式
     * agentmain 方法在目标 JVM 中实际运行 agent 的线程中执行，因此 agentmain 方法不能修改目标 JVM 的状态。
     * agentmain方法在 premain 方法之后执行，并且是在目标JVM 中实际运行 agent 的线程中执行，因此 agentmain 方法可以修改目标 JVM 的状态。
     *
     * 参数：agentArgs agent参数
     * instrumentation agent运行时的环境
     * @param agentArgs
     * @param inst
     */
    public static void agentmain(String agentArgs, Instrumentation inst) {
        System.out.println("agentmain 执行了...");
    }


    //        new AgentBuilder.Default()
//                // 匹配目标类名称包含 "OrderService"
//                .type(ElementMatchers.nameContains("OrderService"))
//                // 对匹配的类进行增强
//                .transform(new AgentBuilder.Transformer() {
//                    @Override
//                    public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder,
//                                                            TypeDescription typeDescription,
//                                                            ClassLoader classLoader,
//                                                            JavaModule javaModule,
//                                                            ProtectionDomain protectionDomain) {
//                        return builder
//                                // 匹配名为 "createOrder" 的方法
//                                .method(ElementMatchers.named("createOrder"))
//                                // 指定拦截逻辑为 OrderServiceInterceptor
//                                .intercept(MethodDelegation.to(OrderServiceInterceptor.class));
//                    }
//                })
//                .installOn(inst);


}
